﻿using System;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Input;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Microsoft.Extensions.Logging;

namespace RotovapPlatform.UI.ViewModels.User
{
	/// <summary>
	/// 用户登录视图模型
	/// </summary>
	public partial class LoginViewModel : ObservableObject
	{
		private readonly ILogger<LoginViewModel> _logger;

		/// <summary>
		/// 用户名
		/// </summary>
		[ObservableProperty]
		private string _username = string.Empty;

		/// <summary>
		/// 密码
		/// </summary>
		[ObservableProperty]
		private string _password = string.Empty;

		/// <summary>
		/// 是否记住密码
		/// </summary>
		[ObservableProperty]
		private bool _rememberPassword;

		/// <summary>
		/// 错误信息
		/// </summary>
		[ObservableProperty]
		private string _errorMessage = string.Empty;

		/// <summary>
		/// 是否有错误
		/// </summary>
		[ObservableProperty]
		private bool _hasError;

		/// <summary>
		/// 是否正在加载
		/// </summary>
		[ObservableProperty]
		private bool _isLoading;

		/// <summary>
		/// 版本信息
		/// </summary>
		[ObservableProperty]
		private string _versionInfo;

		/// <summary>
		/// 登录成功事件
		/// </summary>
		public event EventHandler<UserInfo> LoginSuccessful;

		//	/// <summary>
		//	/// 构造函数
		//	/// </summary>
		//	/// <param name="logger">日志记录器</param>
		//	public LoginViewModel(ILogger<LoginViewModel> logger)
		//	{
		//		_logger = logger;
		//		_logger.LogInformation("登录视图模型已初始化");

		//		// 初始化命令
		//		LoginCommand = new RelayCommand(async () => await LoginAsync());

		//		// 获取版本信息
		//		var version = Assembly.GetExecutingAssembly().GetName().Version;
		//		VersionInfo = $"版本 {version?.Major}.{version?.Minor}.{version?.Build}";
		//	}

		//	/// <summary>
		//	/// 登录命令
		//	/// </summary>
		//	public ICommand LoginCommand { get; }

		//	/// <summary>
		//	/// 初始化
		//	/// </summary>
		//	public async Task InitializeAsync()
		//	{
		//		try
		//		{
		//			_logger.LogInformation("正在初始化登录视图...");

		//			// 这里将来会添加实际的初始化逻辑，例如从配置中加载记住的用户名和密码
		//			await Task.Delay(100); // 模拟初始化延迟

		//			// 模拟从配置中加载记住的用户名
		//			if (RememberPassword)
		//			{
		//				Username = "admin"; // 示例用户名
		//			}

		//			_logger.LogInformation("登录视图初始化完成");
		//		}
		//		catch (Exception ex)
		//		{
		//			_logger.LogError(ex, "初始化登录视图时发生错误");
		//			HasError = true;
		//			ErrorMessage = "初始化失败: " + ex.Message;
		//		}
		//	}

		//	/// <summary>
		//	/// 登录
		//	/// </summary>
		//	private async Task LoginAsync()
		//	{
		//		try
		//		{
		//			// 清除错误信息
		//			HasError = false;
		//			ErrorMessage = string.Empty;

		//			// 验证输入
		//			if (string.IsNullOrWhiteSpace(Username))
		//			{
		//				HasError = true;
		//				ErrorMessage = "请输入用户名";
		//				return;
		//			}

		//			if (string.IsNullOrWhiteSpace(Password))
		//			{
		//				HasError = true;
		//				ErrorMessage = "请输入密码";
		//				return;
		//			}

		//			IsLoading = true;
		//			_logger.LogInformation($"正在尝试登录，用户名: {Username}");

		//			// 这里将来会添加实际的登录逻辑
		//			await Task.Delay(1000); // 模拟登录延迟

		//			// 模拟登录验证
		//			if (Username == "admin" && Password == "admin")
		//			{
		//				_logger.LogInformation("登录成功");

		//				// 创建用户信息
		//				var userInfo = new UserInfo
		//				{
		//					Username = Username,
		//					DisplayName = "管理员",
		//					Role = "Administrator"
		//				};

		//				// 触发登录成功事件
		//				LoginSuccessful?.Invoke(this, userInfo);
		//			}
		//			else
		//			{
		//				_logger.LogWarning("登录失败，用户名或密码错误");
		//				HasError = true;
		//				ErrorMessage = "用户名或密码错误";
		//			}
		//		}
		//		catch (Exception ex)
		//		{
		//			_logger.LogError(ex, "登录时发生错误");
		//			HasError = true;
		//			ErrorMessage = "登录失败: " + ex.Message;
		//		}
		//		finally
		//		{
		//			IsLoading = false;
		//		}
		//	}
		//}

		/// <summary>
		/// 用户信息类
		/// </summary>
		public class UserInfo
		{
			/// <summary>
			/// 用户名
			/// </summary>
			public string Username { get; set; }

			/// <summary>
			/// 显示名称
			/// </summary>
			public string DisplayName { get; set; }

			/// <summary>
			/// 角色
			/// </summary>
			public string Role { get; set; }
		}
	}
}